extends Node

const _数据模型集:Dictionary={
	成就="res://数据模型/成就.gd",
	角色="res://数据模型/名人.gd",
	事件="res://数据模型/事件.gd",
	天赋="res://数据模型/天赋.gd",	
}
var 总天赋集:Dictionary={}
var 总事件集:Dictionary={}
var 总名人集:Dictionary={}
var 品质天赋集:Dictionary={
	0:{},
	1:{},	
	2:{},	
	3:{},
	4:{},	
}

func _ready():
	randomize()
	初始化天赋集()
	初始化事件集()
	初始化名人集()
	
func 初始化天赋集():
	for id in GameData.初始数据.天赋:
		var 天赋数据:天赋数据类=生成数据模型("天赋",id)
		总天赋集[id]=天赋数据
		if not 天赋数据.独有:
			品质天赋集[天赋数据.品质][id]=天赋数据
	
func 初始化事件集():
	for id in GameData.初始数据.事件:
		var 事件数据=生成数据模型("事件",id)
		总事件集[id]=事件数据

func 初始化名人集():
	for id in GameData.初始数据.角色:
		var 名人数据=生成数据模型("角色",id)
		总名人集[id]=名人数据	

func 生成数据模型(数据表:String,id:String):
	var 数据集=GameData.初始数据[数据表]
	if 数据集.has(id):
		var 模型脚本=load(_数据模型集[数据表])
		var 数据模型:BaseObject=模型脚本.new()		
		var 初始数据=数据集[id]
		数据模型.初始化数据(初始数据)
		return 数据模型

func 获取天赋(id:String):
	if 总天赋集.has(id):
		return 总天赋集[id]

func 获取事件(id:String):
	if 总事件集.has(id):
		return 总事件集[id]

func 获取名人(id:String):
	if 总名人集.has(id):
		return 总名人集[id]

func 获取年龄随机事件(age:int):
	var 原始事件数据=GameData.初始数据.年龄[str(age)].event
	var 事件权重集:Dictionary=解析权重(原始事件数据)
	var 事件数据集:Dictionary={}
	for id in 事件权重集:
		var 事件数据:事件数据类=获取事件(str(id))
		if 事件数据 and 事件数据.事件可随机触发():
			事件数据集[事件数据]=事件权重集[id]
	var 随机事件=获取随机数据(事件数据集)
	return 随机事件
	
func 解析权重(items:Array):
	var result: Dictionary = {}
	for item in items:
		if item is String:
			if "*" in item:
				var strs=item.split("*",false,2)
				var id = strs[0]
				var weight=strs[1]
				result[int(id)] = float(weight)
			else:
				result[int(item)] = 1
		else:
			result[item] = 1
	return result
	
func 获取随机数据(data:Dictionary):
	var 总权重:float=0
	for key in data:
		总权重+=data[key]
	
	var 随机数:float=randf_range(0,总权重)
	var 权重和:float=0
	for key in data:
		权重和+=data[key]
		if 随机数<=权重和:
			return key

func _获取随机天赋(_总天赋集:Dictionary,个数:int):
	var 天赋集:Array=[]
	var 已选个数:int=0
	while 已选个数<个数:
		var 随机天赋index=randi_range(0,_总天赋集.size()-1)
		var 随机天赋id=_总天赋集.keys()[随机天赋index]
		var 随机天赋:天赋数据类=获取天赋(随机天赋id)
		if 随机天赋 and not 随机天赋.独有 and 随机天赋.兼容天赋集(天赋集) and not 天赋集.has(随机天赋):
			天赋集.append(随机天赋)
			已选个数+=1
	return 天赋集
	
func 获取随机天赋(个数:int):
	return _获取随机天赋(总天赋集,个数)

func 获取品质随机天赋(品质:int):
	return _获取随机天赋(品质天赋集[品质],1).front()
	
func _获取随机名人(_总名人集:Dictionary,个数:int):
	var 名人集:Array=[]
	var 已选个数:int=0
	while 已选个数<个数:
		var 随机名人index=randi_range(0,_总名人集.size()-1)
		var 随机名人id=_总名人集.keys()[随机名人index]
		var 随机名人:名人数据类=获取名人(随机名人id)
		if 随机名人 and not 名人集.has(随机名人):
			名人集.append(随机名人)
			已选个数+=1
	return 名人集

func 获取随机名人():
	return _获取随机名人(总名人集,1).front()
